<template>
  <div>
     <el-card class="box-card">
        <div slot="header" class="clearfix">
          <Breadcrumb>内容管理</Breadcrumb>
        </div>
        <div style="padding-bottom: 20px;">
          <el-radio-group v-model="isCollected"  size="small" @change="hCollect">
            <el-radio-button :label="false">全部</el-radio-button>
            <el-radio-button :label="true">收藏</el-radio-button>
          </el-radio-group>
          <el-button type="success" size="mini" style="float:right" @click="dialogVisible=true">上传图片素材</el-button>
        </div>
           <!-- 素材列表 -->
            <!--
        gutter: 间隔。列与列之间的间隔大小
        :span="4"。一行有24份，它就表示占4份，就表示一行有6列。
      -->
      <el-row :gutter="10">
        <el-col
        :span="4"
         class="img_item"
        v-for="item in images"
            :key="item.id">
          <el-image
            style="height: 180px;width: 180px"
            :src="item.url" fit="cover">
          </el-image>
          <div class="option" v-show="!isCollected">
            <span @click="yanse(item)" class="el-icon-star-off" :class="{'red': item.is_collected}"></span>
            <span class="el-icon-delete" @click="hDelete(item.id)"></span>
          </div>
        </el-col>
      </el-row>
            <!-- 分页
        1.total: 一共有多少条数据 默认情况，它会以每页10条进行计算总页数
        2. current-change事件。当点击页码时，它会触发并会传入当前的页码。
        :disabled="isLoading"
      -->
      <el-pagination
        style="margin-top: 10px"
        background
        layout="prev, pager, next"
        @current-change="hPageChange"
        :total="total_count">
      </el-pagination>
    </el-card>
    <!-- action： 必选参数，上传的地址：http://ttapi.research.itcast.cn/mp/v1_0/user/images
    headers: 设置上传的请求头部。要携带token
    name：上传的文件字段名。要与接口中要求保持一致。
    show-file-list： 是否显示已上传文件列表
    before-upload: 上传之前对文件进行检测。
    on-success：文件上传成功时的钩子。function(response, file, fileList) -->
    <el-dialog title="上传素材" :visible.sync="dialogVisible" append-to-body >
        <el-upload
          class="avatar-uploader"
          action="http://ttapi.research.itcast.cn/mp/v1_0/user/images"
          :headers="headers"
          :on-success="hUploadSuccess"
          name="image"
          :show-file-list="false"
          :before-upload="beforeAvatarUpload">
        <!-- 如果当前有预览地址就说明图片上传成功了。 -->
        <img v-if="imageUrl" :src="imageUrl" class="avatar" @load="hLoadImgOk">
        <i v-else class="el-icon-plus avatar-uploader-icon"></i>
      </el-upload>
    </el-dialog>
  </div>
</template>

<script>
// import tokenStr from '@/utils/request.js'
export default {
  name: 'ImageIndex',
  data () {
    return {
      headers: {
        Authorization: `Bearer ${localStorage.getItem('tokenStr')}`
      },
      dialogVisible: false, // 上传素材图片的对话框
      curPage: 1, // 当前查询第几页
      total_count: 0, // 查询的总数量
      isCollected: false, // 最初选中全部
      images: [],
      imageUrl: '' // 图片的预览地址。当上传成传会从后端返回的结果取出
    }
  },
  created () {
    this.loadImages()
  },
  methods: {
    // 红星
    async yanse (item) {
      // console.log(11111111111111, item)
      // 对象的解构赋值
      const { id, is_collected: isCollected } = item

      console.log(id, isCollected)
      try {
        const res = await this.$http({
          method: 'PUT',
          url: '/mp/v1_0/user/images/' + id,
          data: {
            collect: !isCollected // 切换 是否收藏
          }
        })
        console.log('我是', res)
        // 如果代码成功到了这里，说明这个ajax是成功的。
        res.is_collected = !isCollected
        this.$message.success('操作成功')
      } catch (error) {
        this.$message.error('操作失败')
      }
    },
    hLoadImgOk () {
      setTimeout(() => {
        this.dialogVisible = false
        this.imageUrl = ''
      }, 1000)
    },
    // 如果上传成功，则会把响应结果传给res
    hUploadSuccess (res, file) {
      console.log(res)
      // 保存上传成功之后的图片地址
      this.imageUrl = res.data.url
      this.$message.success('上传素材成功')
      this.loadImages()
    },
    beforeAvatarUpload (file) {
      const isJPG = file.type === 'image/jpeg'
      const isLt2M = file.size / 1024 / 1024 < 2

      if (!isJPG) {
        this.$message.error('图片只能是 JPG 格式!')
      }
      if (!isLt2M) {
        this.$message.error('图片大小不能超过 2MB!')
      }
      return isJPG && isLt2M
    },
    // 删除图片
    hDelete (id, index) {
      this.$confirm('你确定要退出码？')
        .then(async () => {
          try {
            // this.$message({
            //   type: 'success',
            //   message: '删除成功!'
            // })
            const res = await this.$http({
              method: 'DELETE',
              url: '/mp/v1_0/user/images/' + id
            })
            console.log(res)
            // 3. 根据接口的反馈信息做后续处理
            // 如果这个操作不报错误，则可以认为是删除成功，
            // 下面要更新页面，有两种方案
            // (1) 再做一次查询(更加严谨，数据是从后端再次求回来的)
            this.loadImages()
          } catch (error) {
            this.$message.error('删除失败！')
          }
        }).catch(() => {})
    },
    hPageChange (curPage) {
      // 1.更新页码
      this.curPage = curPage
      this.loadImages()
    },
    // 收藏和全部
    hCollect () {
      console.log(this.isCollected)
      // 1. 重置页码=1
      this.curPage = 1
      // 2. 重发请求
      this.loadImages()
    },
    async loadImages () {
      const res = await this.$http({
        method: 'GET',
        url: '/mp/v1_0/user/images',
        params: {
          collect: this.isCollected, // 是否是收藏，还是全部
          page: this.curPage,
          per_page: 10
        }
      })
      console.log(res)
      this.images = res.data.data.results
      // 保存
      this.total_count = res.data.data.total_count
    }
  }
}
</script>

<style lang="less" scoped>
  .img_item {
    position: relative;
    box-sizing: border-box;
  }
  .option {
    position: absolute;
    left: 5px;
    width:180px;
    bottom: 5px;
    height: 30px;
    line-height: 30px;
    background: rgba(0, 0, 0, 0.3);
    text-align: center;
    color: #fff;
    span {
      margin: 0 30px;
      cursor: pointer;
    }
    .red{
      color: red;
    }
  }
.avatar-uploader {
    text-align: center;
}
.avatar-uploader-icon {
    font-size: 28px;
    color: #8c939d;
    width: 178px;
    height: 178px;
    line-height: 178px;
    text-align: center;
}
.avatar-uploader /deep/ .el-upload {
    border: 1px dashed #d9d9d9;
    border-radius: 6px;
    cursor: pointer;
    position: relative;
    overflow: hidden;
}
</style>
